package com.yc.baihe.utils;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

public class Reflect {
	@SuppressWarnings("rawtypes")
	public static <T> T regInfo(HttpServletRequest request,Class<T> c){
		//List<T> list=new ArrayList<T>();  //存放所有提交的数据
		String key; 
		List<String> setMethodName=new ArrayList<String>(); //存储所有的set方法名 拼接成的
		String methodName=null;
		T t=null;
		try {
			Enumeration en=request.getParameterNames(); //传过来的数据的名字   即表单中的  name 属性值
			while(en.hasMoreElements()){
				key=(String) en.nextElement();	//存储传过来的数据的名字   即表单中的  name 属性值
				setMethodName.add("set"+key);  //拼接成set方法名
			}
			t=c.newInstance();//将class类实例化
			Method[]  methods=c.getMethods(); //获得class类中的所有方法
			int startindex;
			int endindex;
			String typeName=null;
			String obj=null;
			
			for(Method md:methods){
				String smd=String.valueOf(md);  //得到所有方法的方法名
				methodName=md.getName();
				
				for(String smn:setMethodName){
					if(smn.equalsIgnoreCase(methodName)){ //如果UserInfo类中的方法名和网页中的name属性值的名字相等
						//val=request.getParameter(meName.replace("set", "")); //去屌set的方法名  也是网页中name的属性值
						startindex=smd.indexOf(methodName)+methodName.length()+1;
						endindex=smd.indexOf(")");
						typeName=smd.substring(startindex,endindex);
						obj=request.getParameter(smn.substring(3));
						//将对应的属性注入到t中
						if(obj!=null && !"".equals(obj)){
							if(typeName.equals("java.lang.String")){
								md.invoke(t, obj);
							}else if(typeName.equals("java.lang.double")){
								md.invoke(t, Double.parseDouble(String.valueOf(obj)));
							}else if(typeName.equals("int")){
								md.invoke(t, Integer.parseInt(String.valueOf(obj)));
							}else{
								md.invoke(t, obj);
							}
						}
						break;
					}
				}
			}
			//list.add(t);
			//System.out.println(list);
		}catch (Exception e) {
			e.printStackTrace();
		}	
		return t;
	}
}
